package com.atguigu.reflect;

import jakarta.annotation.Resource;
import org.junit.Test;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class TestCar {
    //  1  获取class对象的多种方式
    @Test
    public void test01() throws Exception {
//        1 通过类名.class获取
        Class<Car> clazz1 = Car.class;
//         System.out.println(clazz1);
//        2 对象.getClass()
        Class<? extends Car> clazz2 = new Car().getClass();
//        System.out.println(clazz2);
//        3 Class.forName("全路径")
        Class clazz3 = Class.forName("com.atguigu.reflect.Car");
//        System.out.println(clazz3);

//        实例化
        Car car = (Car) clazz3.getConstructor().newInstance();
        System.out.println(car);
    }

    //    2 用反射获取类里面的构造方法
    @Test
    public void test02() throws Exception {
        Class clazz = Car.class;
//        获取所有构造
//        getConstructors只针对public方法
//        Constructor[] constructors = clazz.getConstructors();
        //        getDeclaredConstructors()获取所有构造方法
        Constructor[] constructors = clazz.getDeclaredConstructors();
        for (Constructor constructor : constructors) {
            System.out.println("方法名称：" + constructor.getName() + "参数的个数：" + constructor.getParameterCount());
        }
//        指定有参数的构造创建对象
//        1 构造public
//        Constructor c1 = clazz.getConstructor(String.class, int.class, String.class);
//        Car car1 = (Car) c1.newInstance("vw", 18, "yellow");
//        System.out.println(car1);
//        2 构造private
        Constructor c2 = clazz.getDeclaredConstructor(String.class, int.class, String.class);
        c2.setAccessible( true);
        Car car2 = (Car) c2.newInstance("jetta", 15, "white");
        System.out.println(car2);
        
    }
//    3 用反射获取类里面的属性

//    4 通过反射获取类中所有的方法


}
